//
//  TestViewController.swift
//  HHSwift
//
//  Created by 华宏 on 2019/1/22.
//  Copyright © 2019年 huahong. All rights reserved.
//

import UIKit

class UIHomeController: BaseViewController,UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout {

    var dataArray:[String] = ["UIView","UITextField","UIButton","UIImageView","WKWebView","多线程","UIPageControl","UISegmentedControl","UIMenuController","UITextView","UserDefaults","ContainerViewController"]
    
    var collectionView:UICollectionView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        setupUI()

    }
    
    
//MARK: - 设置UI
    func setupUI()  {
        
        let layout = UICollectionViewFlowLayout()
        
        //cell尺寸
        layout.itemSize = CGSize(width: self.view.width/3, height: self.view.width/3)
        //最小行间隔
//        layout.minimumLineSpacing = 5;
        //最小列间隔
//        layout.minimumInteritemSpacing = 5;
        //滚动方向
        layout.scrollDirection = .vertical
        
        // 设置 UICollectionView 的headerView 和 footerView 的大小
        layout.headerReferenceSize = CGSize.zero
        layout.footerReferenceSize = .zero
        
        // 设置 UICollectionView 的Section 的偏移
        layout.sectionInset = UIEdgeInsets.zero
        
        // 设置 UICollectionView 的 headerView 和 footerView 能够悬浮在屏幕的顶部
        layout.sectionHeadersPinToVisibleBounds = true
        layout.sectionFootersPinToVisibleBounds = true
        collectionView = UICollectionView(frame: self.view.bounds, collectionViewLayout: layout)
        collectionView.delegate = self
        collectionView.dataSource = self
        collectionView.backgroundColor = .white
        collectionView.backgroundView = UIView.init()
        //内容偏移量
        collectionView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
        
        // Collection 是否允许预加载
        collectionView.isPrefetchingEnabled = true
        // 预加载的代理
//        collectionView.prefetchDataSource = self
        
        //注册cell header
        collectionView.register(UIHomeCell.self, forCellWithReuseIdentifier: "cell")
//        collectionView.register(UICollectionReusableView.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "header")
        
        // 设置 UICollectionView 的 item 是否能够被选中
        collectionView.allowsSelection = true
        
        // 设置 UICollectionView 的item 能够多选
        collectionView.allowsMultipleSelection = true
        
        
        view.addSubview(collectionView)
    }

    //MARK:- 设置属性
    func setCollection()  {
        
        let indexPath = IndexPath(item: 0, section: 0)
        
        // 让 UICollectionView 自动滑动到指定Section的Item 的位置
        collectionView.scrollToItem(at: indexPath, at: UICollectionView.ScrollPosition.top, animated: true)
        
        // 让 UICollectionView 自动选择指定的Item。并将选中的Item滑动到指定的位置
        collectionView.selectItem(at: indexPath, animated: true, scrollPosition: .top)
        
        // 取消选中的item
        collectionView.deselectItem(at: indexPath, animated: true)
        
        //重新加载
        collectionView.reloadData()
        
        // 设置 UICollectionView 的新的布局，从一个布局到另一个布局的转变
        collectionView.setCollectionViewLayout(UICollectionViewFlowLayout(), animated: true) { (finished) in
            print("重新布局完成")
        }
        
        // 启动动画，对collectionView进行布局
        collectionView.finishInteractiveTransition()
        //成功后就会回调 setCollectionViewLayout：animated ：{} 方法
        
        //取消对collectionView布局的动画
        collectionView.cancelInteractiveTransition()
//        取消后回调 setCollectionViewLayout：animated ：{} 方法
        
        // 获取 collectionView 的整个 Section 的个数
        let _ = collectionView.numberOfSections
        // 获取 collectionView 的某一个 Section 中 item 的个数
        let _ = collectionView.numberOfItems(inSection: 0)
        
        // 获取 collectionView 的 Item 属性：
        let _:UICollectionViewLayoutAttributes? = collectionView.layoutAttributesForItem(at: indexPath)
        // 获取 collectionView 的 ReusableView 的一些属性
        let _:UICollectionViewLayoutAttributes? = collectionView.layoutAttributesForSupplementaryElement(ofKind: UICollectionView.elementKindSectionHeader, at: indexPath)
        
        // 通过collectionView 的Item上某一点获取改 Item 的 indexPath
        let _ = collectionView.indexPathForItem(at: CGPoint(x: 10, y: 10))
        let _ = collectionView.indexPath(for: UICollectionViewCell())
        
        // 通过indexPath 来获取 cell
        let _ = collectionView.cellForItem(at: indexPath)
        
        // 获取 UICollectionView 视图可见的 Cell
        let _:[UICollectionViewCell] = collectionView.visibleCells
        
        // 获取视图上可见的 Item 的 indexPath
        let _:[IndexPath] = collectionView.indexPathsForVisibleItems
        
        // 通过指定的indexPath 还获取 UICollectionView的 headerView & fotterView
        let _:UICollectionReusableView? = collectionView.supplementaryView(forElementKind: UICollectionView.elementKindSectionHeader, at: indexPath)
        
        // 通过给定的类型（UICollectionElementKindSectionHeader、UICollectionElementKindSectionFooter）来获取视图可见的 headerView & footerView
        let _ = collectionView.visibleSupplementaryViews(ofKind: UICollectionView.elementKindSectionHeader)
        
        // 通过给定的类型 （UICollectionElementKindSectionHeader、UICollectionElementKindSectionFooter）来获取视图可见的 indexPath
        let _ = collectionView.indexPathsForVisibleSupplementaryElements(ofKind: UICollectionView.elementKindSectionHeader)
        
        //UICollectionView 的Section 的增加、删除、刷新、移动
        let indexSet = NSIndexSet(index: 0)
        // 插入
        collectionView.insertSections(indexSet as IndexSet)
        // 删除
        collectionView.deleteSections(indexSet as IndexSet)
        // 数据刷新
        collectionView.reloadSections(indexSet as IndexSet)
        // 移动
        collectionView.moveSection(0, toSection: 1)
        
        //UICollectionView 的 Item 的增加、删除、刷新、移动
        // UICollectionView 的 Item 的插入操作
        collectionView.insertItems(at: [indexPath])
        // UICollectionView 的 Item 的删除操作
        collectionView.deleteItems(at: [indexPath])
        // UICollectionView 的 Item 的刷新操作
        collectionView.reloadItems(at: [indexPath])
        // UICollectionView 的 Item 的移动操作
        collectionView.moveItem(at: indexPath, to: indexPath)

        // UICollectionView 的Section 或者 Item 的增加、删除、刷新、移动操作会调用的函数
        collectionView.performBatchUpdates({
            // 要更新的 Layout
        }) { (finished) in
            // 判断是否完成，再做其他事情
        }

        /**
         * 开始交互式移动
         * 是否在移动的时候，对 UICollectionView 的 Item 进行排序,返回一个BOOl 值,默认情况是 true
         * 调用此方法时，集合视图将查询其委托，以确保可以移动该项。如果数据源不支持项的移动，则此方法返回false。
         */
       let _:Bool = collectionView.beginInteractiveMovementForItem(at: indexPath)
        // 更新 UICollectionView 的 Item 移动时的点（位置）
        collectionView.updateInteractiveMovementTargetPosition(CGPoint(x: 10, y: 10))
        //结束交互式移动
        collectionView.endInteractiveMovement()
        //取消交互式移动，将item恢复到原始的点
        collectionView.cancelInteractiveMovement()
    }
    
    //MARK:- 代理方法 UICollectionViewDataSource
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return dataArray.count
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! UIHomeCell
        cell.contentLabel.text = dataArray[indexPath.item]
        return cell
        
    }
    
    // TODO: 设置 UICollectionView 的 headerView & footerView
//    func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
//
//        let reusableView = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "header", for: indexPath)
//        return reusableView
//    }
    // TODO: CollectionView 的编辑时设置是否可以移动 Item
    func collectionView(_ collectionView: UICollectionView, canMoveItemAt indexPath: IndexPath) -> Bool {
        return true
    }
    
    // TODO: UICollectionView 的 Items 移动后，数据资源也要变更
    func collectionView(_ collectionView: UICollectionView, moveItemAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
        /* 这更新原始数据库为变更后的数据结构 */
    }
    
    // TODO: UICollectionView 的索引返回参数
    func indexTitles(for collectionView: UICollectionView) -> [String]? {
        return ["A","B","C","D","E","F"]
    }

    
    //MARK:- 代理方法 UICollectionViewDelegate
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        switch indexPath.item {
        case 0:
                   
               let viewVC = UIViewVC()
               self.navigationController?.pushViewController(viewVC, animated: true)
        case 1:
            
                let textFieldVC = UITextFieldController()
                self.navigationController?.pushViewController(textFieldVC, animated: true)
        case 2:
            
            let buttonVC = UIButtonController()
            self.navigationController?.pushViewController(buttonVC, animated: true)
            
        case 3:
            
            let imageVC = UIImageViewController()
            imageVC.hidesBottomBarWhenPushed = true
            self.navigationController?.pushViewController(imageVC, animated: true)
        case 4:
        
        let imageVC = WKWebViewController()
        imageVC.hidesBottomBarWhenPushed = true
        self.navigationController?.pushViewController(imageVC, animated: true)
        
        case 5:
           let vc =  ThreadController()
           vc.hidesBottomBarWhenPushed = true
           self.navigationController?.pushViewController(vc, animated: true)
        
        case 6:
          let vc =  UIPageControlController()
          vc.hidesBottomBarWhenPushed = true
          self.navigationController?.pushViewController(vc, animated: true)
            
        case 7:
            let vc =  UISegmentController()
            vc.hidesBottomBarWhenPushed = true
            self.navigationController?.pushViewController(vc, animated: true)
        case 8:
            let vc =  MenuControllerVC()
            vc.hidesBottomBarWhenPushed = true
            self.navigationController?.pushViewController(vc, animated: true)
        case 9:
            let vc =  UITextViewController()
            vc.hidesBottomBarWhenPushed = true
            self.navigationController?.pushViewController(vc, animated: true)
        case 10:
            let vc =  UserDefaultsController()
            vc.hidesBottomBarWhenPushed = true
            self.navigationController?.pushViewController(vc, animated: true)
        case 11:
            let vc =  ContainerViewController()
            vc.hidesBottomBarWhenPushed = true
            self.navigationController?.pushViewController(vc, animated: true)
        
        default:
          print(indexPath)
        }
    }
    

    // TODO: 设置CollectionView 的 Item 是否点击Item变为高亮状态。返回结果： true 点击Item 变为高亮状态;false  点击不变为高亮状态
    func collectionView(_ collectionView: UICollectionView, shouldHighlightItemAt indexPath: IndexPath) -> Bool {
        return true
    }
    
    // TODO: UICollectionView 哪一个Item 被点击成为高亮状态后调用该函数
    func collectionView(_ collectionView: UICollectionView, didHighlightItemAt indexPath: IndexPath) {
        
    }
    
    // TODO： UICollectionView的Item由高亮状态变为非高亮状态时调用的函数
    func collectionView(_ collectionView: UICollectionView, didUnhighlightItemAt indexPath: IndexPath) {
        
    }
    
    // TODO: 设置 UICollectionView 是否允许取消选中
    func collectionView(_ collectionView: UICollectionView, shouldDeselectItemAt indexPath: IndexPath) -> Bool {
        return true
    }
    
    // TODO: UICollectionView 的取消选中操作时调用的函数
    func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
        
    }
    
    // TODO: UICollectionViewCell 将要显示在视图上的时候调用该函数
    func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
        
    }
        
    // TODO: UICollectionViewCell 显示结束，指的是Cell滑动移出视图时调用该函数
    func collectionView(_ collectionView: UICollectionView, didEndDisplaying cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
        
    }
    
    // TODO: UICollectionView 的headerView 和 footerView 将要出现的时调用
    func collectionView(_ collectionView: UICollectionView, willDisplaySupplementaryView view: UICollectionReusableView, forElementKind elementKind: String, at indexPath: IndexPath) {
        print("headerView 和 footerView 将要出现在当前视图")
    }
    
    // TODO: UICollectionView 的headerView 和 footerView 滑动移出视图的时调用
    func collectionView(_ collectionView: UICollectionView, didEndDisplayingSupplementaryView view: UICollectionReusableView, forElementOfKind elementKind: String, at indexPath: IndexPath) {
        print("headerView 和 footerView 被移出当前视图")
    }
    
    // TODO: 是否允许 Item 是否显示菜单（Cut/Copy/Paste）
    func collectionView(_ collectionView: UICollectionView, shouldShowMenuForItemAt indexPath: IndexPath) -> Bool {
        return true
    }
    
    // TODO: 设置是否允许菜单内显示哪些按钮
    func collectionView(_ collectionView: UICollectionView, canPerformAction action: Selector, forItemAt indexPath: IndexPath, withSender sender: Any?) -> Bool {
        // 我们可以控制菜单内的按钮显示
        if action == #selector(UIResponderStandardEditActions.cut(_:)){
            return false
        }
        return true
    }
    
    // TODO: 用户点击菜单内的按钮触发的函数
    func collectionView(_ collectionView: UICollectionView, performAction action: Selector, forItemAt indexPath: IndexPath, withSender sender: Any?) {
        print("菜单内的按钮被点击")
    }
    
    // TODO: 设置 UICollectionView 的 Item 是否可以选择
    func collectionView(_ collectionView: UICollectionView, shouldSelectItemAt indexPath: IndexPath) -> Bool {
        return true
    }
    
    // TODO: UICollectionView 重新布局调用该方法
    func collectionView(_ collectionView: UICollectionView, transitionLayoutForOldLayout fromLayout: UICollectionViewLayout, newLayout toLayout: UICollectionViewLayout) -> UICollectionViewTransitionLayout {
        let  TransitionLayout = UICollectionViewTransitionLayout.init(currentLayout: UICollectionViewFlowLayout(), nextLayout: UICollectionViewFlowLayout())
        return TransitionLayout
    }
    
    // MARK: 代理方法 UICollectionViewDelegateFlowLayout
    // TODO:设置 UICollectionView 的 Item size
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: self.view.width/3, height: self.view.width/3)
    }
    
    // TODO: 设置 UICollectionView 的 Section 的上、下、左、右 的偏移
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        return UIEdgeInsets.zero
    }
    
//    // TODO: 设置 UICollectionView 的 Section 的 HeaderView 的大小（宽、高）
//    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
//        return CGSize.init(width: self.view.frame.width, height: 30)
//    }
//
//    // TODO: 设置 UICollectionView 的 Section 的 footerView 的大小（宽、高）
//    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize {
//        return CGSize.init(width: self.view.frame.width, height: 30)
//    }
    
    // TODO: 设置 UICollectionView 的 items 上下最小间距
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return 0
    }
    
    // TODO: 设置 UICollectionView 的 items 左右最小间距
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return  0
    }
    
    // MARK: UICollectionView 预先加载的数据
    func collectionView(_ collectionView: UICollectionView, prefetchItemsAt indexPaths: [IndexPath]) {
        //获取cell ，赋值数据
    }
    // MARK: UICollectionView 取消预先加载的数据
    func collectionView(_ collectionView: UICollectionView, cancelPrefetchingForItemsAt indexPaths: [IndexPath]) {
        // 取消预加载
    }
}


